"""authon: huangjuan
   data:
   project:笔记资料
 """
#1、输入数字n，输出n天前的日期（time或者datatime模块）

import datetime
#获取今天的日期
ntime=datetime.date.today()
#strftime 选择格式化输出
print("当前日期为："+ntime.strftime("%Y-%m-%d"))
n=int(input("请输入您想知道多少天前的日期!!!!"))
ltime=ntime+datetime.timedelta(days=-n)
print(f"{n}天前的日期为："+ltime.strftime("%Y-%m-%d"))

#2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
import os
path=input("请输入您想查询的绝对路径：")
#window系统里面列出目录中的文件与文件夹是用命令dir 其中有<DIR>标志的就是文件夹
print(os.popen(f"dir {path}").read())

#3、列表去重，并且从小到大排序
a=[1,1,2,5,4,7,8,5,94,5,15,48,6,1,45,1,1,6,46,55,16,22,65,42,65,2,2,2,2,2,2]
for i in a:
    while a.count(i)>1:
        a.remove(i)
a.sort()
print(a)

#4、如何在一个函数内部修改全局变量
#使用global关键字 如：
a=1
def aa():
    global a
    a=2
aa()
print(a)


#5、如何跨模块共享全局变量
#在thirteen里面定义x=1
import thirteen
#在twelve里面应用import thirteen 然后thirteen.x=2
import twelve
#故这行代码的输出结果为2 因为x已经在twelve里面被修改了
print(thirteen.x)

#6、python的基本数据类型有哪些？
#数字 （整数 浮点数 复数 常量 布尔） 字符串
#列表 元组 字典 集合

#7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
import random
#随机整数：
print(random.randint(1,10))
#随机小数(1-10)
print(random.uniform(1,10))
#随机小数（0-1）
print(random.random())

#8、python中哪些是可变数据类型，哪些是不可变数据类型
#不可变：数字 字符串 元组
#可变：列表 字典 集合

#9、a+=1与a=a+1有什么区别
#底层调用的不同：‘+=’ 调用的是__iadd__()     ‘+’调用的是__add__()
#其次 对于‘+’而言 不管是对于可变还是不可变对象 都会重新在栈中创建新对象
    #对于‘+=’而言 仅仅只对于不可变对象创建新对象 而对于可变对象便不会创建

#10、什么是pep8？说出5点它的标准
#1.使用 4 个空格的缩进，不要使用制表符。
#2.折行以确保其不会超过 79 个字符。这有助于小显示器用户阅读，也可以让大显示器能并排显示几个代码文件。
#3.使用空行分隔函数和类，以及函数内的大块代码。
#4.如果可能，注释独占一行。
#5.使用文档字符串。
#6.运算符周围和逗号后面使用空格，但是括号里侧不加空格： a = f(1, 2) + g(3, 4)

#11、给定一个字符串，找出字符串第一个重复的字符
a="ghjklsdfghj"
s=''
for i in range(len(a)):
    aa=a[:i]
    if a[i] in aa:
        s=a[i]
        break
print(f"第一次出现的字符为'{s}'")

#12、简述深拷贝与浅拷贝
# 浅拷贝可能会造成修改拷贝之后的值(内层容器的值)。会改变原来的值
#     浅拷贝只会拷贝第一层（外面第一层容器）的地址（也就是b拷贝的是引用的地址，不会拷贝值）
#     a={"name":"sc","score":[80,90,100]}
#     b=a.copy()
#     b["score"].append(110)
#     a,b都会变成{"name":"sc","score":[80,90,100，110]}
# a,b的id是不一样的  但是a["score"]和b["score"]是一样的
# 拷贝的都是地址 {“name的地址”：“sc的地址”，“score的地址”：“列表的地址”}
# 深拷贝就是拷贝每一层地址
# import copy
# a = {"name": "sc", "score": [80, 90, 100]}
# b = copy.deepcopy(a)
# 拷贝的是：{"新的name": "新的sc", "新的score": 新的列表}
# 这样a["score"]和b["score"]的id是不一样的
# 只有用copy.deepcopy才是深拷贝 其他都是浅拷贝

#13、简述python内存机制
#以引用计数为主，分代回收，标记清除为辅的垃圾回收方式，
# 以及对小整型进行缓存以及简单字符驻留的内存池机制

#14、使用python实现冒泡排序，快速排序

#冒泡排序
print("这是冒泡排序")
a=[900,1,54,15,85,4,1,58,47,56,96,54,77,85]
for i in range(len(a)-1):
    for j in range(len(a)-1):
        if a[j]>a[j+1]:
            t=a[j]
            a[j]=a[j+1]
            a[j+1]=t
print(a)

#快排
print("这是快排")
a=[900,1,54,15,85,4,1,58,47,56,96,54,77,85]

def paixu(s,l,r):
    if l>r:
        return
    left=l
    right=r
    p=s[l]
    while left<right:
        while s[right]>=p and right>left:
            right-=1
        s[left]=s[right]

        while s[left]<=p and right>left:
            left+=1
        s[right]=s[left]
        s[right]=p
    paixu(s,l,right-1)
    paixu(s,right+1,r)

paixu(a,0,len(a)-1)
print(a)

# #15、验证一个字符串是否属于回文（从左到右，从右到左都是一样）
a=str(input("请输入您要验证的字符串："))
aa=a[::-1]
if a==aa:
    print("这个字符串属于回文")
else:
    print("验证失败")

